Méthodologie utilisé

lors de ce projet nous aurons recours à la méthode CRISP “Cross-Industry Standard Process for Data Mining” vu que c’est la methode la plus utilisée pour orienter nos travaux d’éxploration de données .

Metier

Le tourisme tunisien a du mal à se relever de la révolution et de ses suites. Les chiffres 2013 le montrent: le nombre de nuitées touristiques a baissé entre 2010 et 2013 de plus de 15% (de 35,5 millions de nuitées à 30 millions) . en 2015 la Tunisie est devenue une no-go-zone pour les touristes étrangers suite aux attentats mais Les revenues du tourisme tunisien ont connu une amélioration de 42% estimées à 554 Millions de dollars dans les sept premiers mois de l’année 2018 le secteur est alors en train de guérir .

Cependant la compagnie tunisienne vise à modériniser sa flotte afin d’assurer les conditions les plus favorables aux visiteurs de notre pays .

Notre objectif metier consiste donc à : Notre data science goal consiste à :

Dans le but de pouvoir atteindre nos objéctifs nous aurons recours aux ressources contenant les données et les informations nécessaires liées aux avions du monde , Royal Maroc Air et Tunisair

Dataset

moyennant 5 fichiers :

Exploration du fichier review

Chargement des library
library(ggplot2)
library(dplyr)
library(gridExtra)
library(grid)
library(lattice)
library(ggpubr)
library(DataExplorer)
library(cluster)
library(factoextra)
library(tidyr)
library(FactoMineR)
library(tidyverse)
library(corrplot)
library(gridExtra)
library(GGally)
library(factoextra)

Importation des données

airline <- read.csv("airline.csv")

Préparation des données

nous avons besoin des noms des compagnies seulement,cabin flown seat comfort rating entretanment value money staff rating ground service rating recommended overall_rating wifi rating .

quanti<-airline[,c(1,10,12,13,14,15,16,17,18,19,20)]

Voir s’il y a des données manquantes.

plot_missing(quanti)

On remarque qu’il y a des données manquantes dans les colonnes ground service and wifi connectivte alors on va les enlever .
quanti<-airline[,c(1,10,12,13,14,15,16,19,20)]
summary(quanti)
##            airline_name            cabin_flown    overall_rating 
##  spirit-airlines :  990                  : 2876   Min.   : 1.00  
##  british-airways :  901   Business Class : 6347   1st Qu.: 3.00  
##  united-airlines :  840   Economy        :29784   Median : 7.00  
##  jet-airways     :  727   First Class    :  879   Mean   : 6.04  
##  air-canada-rouge:  715   Premium Economy: 1510   3rd Qu.: 9.00  
##  emirates        :  691                           Max.   :10.00  
##  (Other)         :36532                           NA's   :4535   
##  seat_comfort_rating cabin_staff_rating food_beverages_rating
##  Min.   :0.000       Min.   :0.000      Min.   :0.000        
##  1st Qu.:2.000       1st Qu.:2.000      1st Qu.:1.000        
##  Median :3.000       Median :4.000      Median :3.000        
##  Mean   :3.095       Mean   :3.319      Mean   :2.806        
##  3rd Qu.:4.000       3rd Qu.:5.000      3rd Qu.:4.000        
##  Max.   :5.000       Max.   :5.000      Max.   :5.000        
##  NA's   :7690        NA's   :7688       NA's   :8132         
##  inflight_entertainment_rating value_money_rating  recommended    
##  Min.   :0.000                 Min.   :0.000      Min.   :0.0000  
##  1st Qu.:1.000                 1st Qu.:2.000      1st Qu.:0.0000  
##  Median :2.000                 Median :4.000      Median :1.0000  
##  Mean   :2.392                 Mean   :3.164      Mean   :0.5338  
##  3rd Qu.:4.000                 3rd Qu.:4.000      3rd Qu.:1.0000  
##  Max.   :5.000                 Max.   :5.000      Max.   :1.0000  
##  NA's   :10282                 NA's   :1673
names(airline)
##  [1] "airline_name"                  "link"                         
##  [3] "title"                         "author"                       
##  [5] "author_country"                "date"                         
##  [7] "content"                       "aircraft"                     
##  [9] "type_traveller"                "cabin_flown"                  
## [11] "route"                         "overall_rating"               
## [13] "seat_comfort_rating"           "cabin_staff_rating"           
## [15] "food_beverages_rating"         "inflight_entertainment_rating"
## [17] "ground_service_rating"         "wifi_connectivity_rating"     
## [19] "value_money_rating"            "recommended"

Dans ce fichier on a utilisé les notes (reviews) de chaque service (food, staff, seat review, wifi….) dans toutes les compagnies aériennes

 airline_sample <- na.omit(quanti)
airline_without_text<-airline_sample[,c(3,4,5,6,7,8)]
airline_sample<-airline_sample[,c(1,2,3,4,5,6,7,8)]

Aprés la préparation des données on passe à la classification des services offerts par Tunisair par rapport aux autres compagnies.

Combien de clusters?

Pour étudier graphiquement quelle valeur de k nous donne la meilleure partition, nous pouvons tracer entre banseens et tot.withinss vs choix de k.

for(i in 1:10){
  
  # Pour chaque k, calcule entre etbetweenss et tot.withinss
  bss[i] <- kmeans(airline_without_text, centers=i)$betweenss
  wss[i] <- kmeans(airline_without_text, centers=i)$tot.withinss
}
grid.arrange(p3, p4, ncol=2)

k <-list()
for(i in 1:10){
  k[[i]] <- kmeans(airline_without_text,i)
}


betweennss_totss <- list()
for(i in 1:10){
  betweennss_totss[[i]] <- k[[i]]$betweenss/k[[i]]$totss
}

#type = b to say that we want it to
#be both dots and lines
plot(1:10,betweennss_totss,type="b",
     ylab="Between SS / Total SS",
     xlab = "Cluster(k)")

On remarque que la meilleure ségmentation est avec 3 clusters :

set.seed(0)
air_k2 <- kmeans(airline_without_text, centers=3)
plot(airline_sample,col = air_k2$cluster)

air_k2$centers
##   overall_rating seat_comfort_rating cabin_staff_rating
## 1       9.036940            4.305773           4.673919
## 2       2.066653            1.972632           2.004141
## 3       6.941714            3.388244           3.801556
##   food_beverages_rating inflight_entertainment_rating value_money_rating
## 1              4.289334                      3.983947           4.582052
## 2              1.734700                      1.636134           1.802464
## 3              2.829341                      1.729192           3.782662

Apres le clustering on a obtenu 3 groupes (bon , moyen, mauvais). Selectionnons les (notes) reviews de tunisair pour trouver son emplacement par rapport aux autres compagnies.

tunisair_riview = airline[which(airline$airline_name=="tunisair"),]
summary(tunisair_riview[,c(12,13,14,15,16,19,20)])
##  overall_rating seat_comfort_rating cabin_staff_rating
##  Min.   : 1.0   Min.   :1.000       Min.   :1.000     
##  1st Qu.: 4.0   1st Qu.:3.000       1st Qu.:1.000     
##  Median : 6.0   Median :3.500       Median :3.500     
##  Mean   : 5.8   Mean   :3.273       Mean   :2.909     
##  3rd Qu.: 8.0   3rd Qu.:4.000       3rd Qu.:4.000     
##  Max.   :10.0   Max.   :5.000       Max.   :5.000     
##  NA's   :14     NA's   :27          NA's   :27        
##  food_beverages_rating inflight_entertainment_rating value_money_rating
##  Min.   :1.0           Min.   :0                     Min.   :0.000     
##  1st Qu.:1.0           1st Qu.:0                     1st Qu.:2.000     
##  Median :3.0           Median :1                     Median :4.000     
##  Mean   :2.5           Mean   :1                     Mean   :3.061     
##  3rd Qu.:3.0           3rd Qu.:1                     3rd Qu.:4.000     
##  Max.   :5.0           Max.   :3                     Max.   :5.000     
##  NA's   :27            NA's   :27                    NA's   :16        
##   recommended    
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :0.0000  
##  Mean   :0.3469  
##  3rd Qu.:1.0000  
##  Max.   :1.0000  
## 
  • On remarque que plus de 34% des passagers recommandent Tunisair.
  • Le food ,staff rating and seat rating sont trés faibles , c’est pour cela qu’on trouve Tunisair dans le 3 éme cluster.

nous trouvons que Tunisair ne posséde aucun problème au niveau du staff qui a une note trés proche du premier cluster

Puisque notre projet consite à améliorer la flotte de Tunisair nous avons choisi de la comparer avec une compagnie du premier cluster afin de trouver ce qui manque Tunisair d’être dans le premier cluster.

Tirer le profil typique à travers le fichier delta.csv pour savoir si Tunisair repond aux exigences d’une flotte typique.

Exploration du fichier delta

Commençons par l’importation du fichier delta.csv

## [1] FALSE

Visiblement notre fichier delta.csv ne contient aucune valeur manquantes passant ensuite a l’analyse de notre fichier : commencant par la boxplot :

boxplot(deltaFlotte)

nous remarquons que les valeurs n’ont pas la même unité alors nous allons passer au scaling :

deltaFlotteScale<-scale(deltaFlotte,scale = T,center = T)
boxplot(deltaFlotteScale)

Maintenant les données sont centrées ! passons ensuite à l’étape suivante qui consiste à déterminer le nombre de cluster que nous pouvons avoir

wss <- (nrow(deltaFlotteScale)-1)*sum(apply(deltaFlotteScale,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(deltaFlotteScale,
centers=i)$withinss)
plot(1:15, wss, type="b", xlab="Number of Clusters",
ylab="Within groups sum of squares")

d’aprés le schéma nous pourrons diviser notre base sur 4 groupes, appliquons le kmeans :

set.seed(125)
km = kmeans(deltaFlotteScale,4)
gpe.kmeans = km$cluster
gpe.kmeans
##                  Airbus A319              Airbus A319 VIP 
##                            3                            4 
##                  Airbus A320             Airbus A320 32-R 
##                            3                            3 
##              Airbus A330-200        Airbus A330-200 (3L2) 
##                            2                            2 
##        Airbus A330-200 (3L3)              Airbus A330-300 
##                            2                            2 
##                   Boeing 717         Boeing 737-700 (73W) 
##                            3                            3 
##         Boeing 737-800 (738)         Boeing 737-800 (73H) 
##                            3                            3 
##       Boeing 737-900ER (739)         Boeing 747-400 (74S) 
##                            3                            2 
##         Boeing 757-200 (75A)         Boeing 757-200 (75E) 
##                            3                            2 
##         Boeing 757-200 (75M)         Boeing 757-200 (75N) 
##                            3                            3 
##         Boeing 757-200 (757)         Boeing 757-200 (75V) 
##                            3                            3 
##         Boeing 757-200 (75X)               Boeing 757-300 
##                            2                            3 
##         Boeing 767-300 (76G)         Boeing 767-300 (76L) 
##                            2                            2 
##         Boeing 767-300 (76P)         Boeing 767-300 (76Q) 
##                            3                            3 
##         Boeing 767-300 (76T)         Boeing 767-300 (76U) 
##                            2                            3 
##     Boeing 767-300 (76Z V.1)     Boeing 767-300 (76Z V.2) 
##                            2                            2 
##         Boeing 767-400 (76D)             Boeing 777-200ER 
##                            2                            2 
##             Boeing 777-200LR CRJ 100/200 Pinnacle/SkyWest 
##                            2                            1 
##       CRJ 100/200 ExpressJet                      CRJ 700 
##                            1                            3 
##                      CRJ 900                         E120 
##                            3                            1 
##                         E170                         E175 
##                            3                            3 
##                      ERJ-145                        MD-88 
##                            1                            3 
##                        MD-90                    MD-DC9-50 
##                            3                            3

Ici nous remarquons qu’il existe un cluster contenant un seul avion VIP de la classe club Airbus A319 VIP nous allons maintenant ajouter les clusters afin de pouvoir visualiser la répartition des avions :

library(FactoMineR)
#ajouter la colonne contenant le numero ducluster.
delta_withcluster=cbind(deltaFlotteScale,gpe.kmeans)
PCA_delta=PCA(delta_withcluster,quali.sup=34,quanti.sup = c(1,2,4,5,7,8,10,11,13,14,29,30,31,23,33))

Nous visualisons la répartition des avions entre les clusters

PCA_delta=PCA(delta_withcluster,quali.sup=34,quanti.sup = c(1,2,4,5,7,8,10,11,13,14,29,30,31,23,33))

res.pca <- PCA(delta_withcluster, graph = FALSE)
fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE 
             )

#11
#plot(PCA_delta,habillage=34,col.hab=c("black","green","red","orange"))
  • Nous trouvons quelques avions qui sont trés différents des autres comme Airbus A319 et E120.

Analyse de chaque cluster

datacluster=as.data.frame(delta_withcluster)
cluster1= datacluster[which(datacluster$gpe.kmeans==1),]
cluster2= datacluster[which(datacluster$gpe.kmeans==2),]
cluster3= datacluster[which(datacluster$gpe.kmeans==3),]
cluster4= datacluster[which(datacluster$gpe.kmeans==4),]

fusion<-as.data.frame(cbind(delta,groupe=datacluster$gpe.kmeans))
aff<-as.data.frame(fusion)
aggregate(aff,by=list(aff$groupe),FUN=mean)
Cluster 1
h<-cluster1[,c(1,10,12,13,14,15,16,17,18,19,20)]
corrplot(cor(h), type="upper", method="ellipse", tl.cex=0.9)

PcaCl1=PCA(cluster1,quali.sup=29,quanti.sup = c(1,2,4,5,7,8,10,11,26,27,20))

res.pca <- PCA(h, graph = FALSE)

fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE 
             )

cluster1_sof <- fusion[which(fusion$groupe==1),]
aggregate(cluster1_sof,by=list(cluster1_sof$groupe),FUN=mean)
  • Faible cluster en Economy Class, Accomodation,CruisingSpeed, Range, Wingspan, Tail Height et Length - Absence de Business Class, First Class, EcoComfortClass,Wifi, Vidéo, Power, Satellite, Flat-bed et Sleeper dans ce cluster
  • Tunisair doit éviter les avions de ce groupe.

Cluster 2:

h<-cluster2[,c(1,10,12,13,14,15,16,17,18,19,20)]
corrplot(cor(h), type="upper", method="ellipse", tl.cex=0.9)

PcaCl2=PCA(cluster2,quali.sup=29,quanti.sup = c(1,2,4,5,7,8,10,11,26,27,20))

res.pca <- PCA(h, graph = FALSE)

fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE 
             )

cluster2_sof <- fusion[which(fusion$groupe==2),]
aggregate(cluster2_sof,by=list(cluster2_sof$groupe),FUN=mean)

CLUSTER 2 - un bon cluster en Sleeper ,Satellite , Power , Video ,Length..ft , tail.Height wingspan, nombre de moteur varie entre 2 et 3 ,range, Cruising speed, accomodation , seats Economy , Eco comfort , seat business ,seat pitch business, - Moyenne en Wifi - absence de first class.

Cluster 3:

h<-cluster3[,c(1,10,12,13,14,15,16,17,18,19,20)]
corrplot(cor(h), type="upper", method="ellipse", tl.cex=0.9)

PcaCl3=PCA(cluster3,quali.sup=29,quanti.sup = c(1,2,4,5,7,8,10,11,26,27,20))

res.pca <- PCA(h, graph = FALSE)

fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE 
             )

cluster3_sof <- fusion[which(fusion$groupe==3),]
aggregate(cluster3_sof,by=list(cluster3_sof$groupe),FUN=mean)

axe 1 : seatpitch econmy , range miles ,seat first class and length ont une forte corrélation sur axe 1 axe2: firstclass,seatwidth and satelite on une forte corrélation avec l’axe 2

Le cluster 3 - la majorité des avions de ce cluster posséde first class et est faible en business class et en range.miles bon en sleeper - moyen en accomodation .

Cluster 4:

Le cluster 4 contient un seul avion, Vu qu’il contient la classe club .

table(km$cluster)
## 
##  1  2  3  4 
##  4 15 24  1

Possédant le plus de nombre d’observation et plutôt bon de point de vue qualité mais faible en range.miles on ne peut pas considérer le 3eme cluster comme le cluster le plus typique car ces avions ne sont pas conçus pour les longues distances .

nous pouvons considérer le cluster 2 comme le profile typique car il est plutôt bon de point de vue qualité et c’est le deuxieme cluster possédant le nombre d’observation apres le cluster 3 .

head(sort(cluster2$Range..miles.,decreasing = T))
## [1] 2.849619 2.046787 1.531276 1.213734 1.168184 1.168184

CARACTERISATION DES CLUSTERS

Cluster 1 : Ce cluster posséde le nombre d’avions le plus petit avec une qualité médiocre comme E120 et ERJ-145 Tunisair doit eviter ce cluster

Cluster 2: Ce cluster posséde des avions de bonnes qualité , ne possede pas de first class mais la classe economique et la classe buissness sont excellentes.

cluster 3 : ce cluster posséde 3 classes (first class, economy, business), et posséde le plus grand nombre d’avions.

cluster4 : Ce cluster contient un seul avion (A319 VIP).

profil typique

CLUSTER2 représente alors le profil typique des avions dans le monde car d’une part il est le meilleur de point de vue qualité ainsi qu’il contient le plus grand nombre d’individus (modèles d’avion).

Nous passons a l’analyse du fichier tunisair.csv pour savoir si Tunisair repond aux exigences.

Chargement du jeu des données de Tunisair

dataTunisair = read.table('tunisair.csv',sep=";",dec=",",header=T, row.names = 1)
head(dataTunisair)
dim(dataTunisair)
## [1] 28 33

Nous remarquons que la Tunisair dispose de 28 avions. Nous disposons de 28 entrées et 34 variables qui décrivent la dataset.

colnames(dataTunisair)
##  [1] "Seat.Width..Club."        "Seat.Pitch..Club."       
##  [3] "Seat..Club."              "Seat.Width..First.Class."
##  [5] "Seat.Pitch..First.Class." "Seats..First.Class."     
##  [7] "Seat.Width..Business."    "Seat.Pitch..Business."   
##  [9] "Seats..Business."         "Seat.Width..Eco.Comfort."
## [11] "Seat.Pitch..Eco.Comfort." "Seats..Eco.Comfort."     
## [13] "Seat.Width..Economy."     "Seat.Pitch..Economy."    
## [15] "Seats..Economy."          "Accommodation"           
## [17] "Cruising.Speed..mph."     "Range..miles."           
## [19] "Engines"                  "Wingspan..ft."           
## [21] "Tail.Height..ft."         "Length..ft."             
## [23] "Wifi"                     "Video"                   
## [25] "Power"                    "Satellite"               
## [27] "Flat.bed"                 "Sleeper"                 
## [29] "Club"                     "First.Class"             
## [31] "Business"                 "Eco.Comfort"             
## [33] "Economy"

Ce dataset nous permet d’etudier “Aircraft” en se basant sur ces critéres ci dessus

any(is.na(dataTunisair)==1)
## [1] FALSE

Nous n’avons aucune valeur manquante

club=dataTunisair[which(dataTunisair$Club.>0),]
nrow(club)
## [1] 0
firstClasse=dataTunisair[which(dataTunisair$First.Class.>0),]
nrow(firstClasse)
## [1] 0
sleeper=dataTunisair[which(dataTunisair$Sleeper>0),]
nrow(sleeper)
## [1] 0
flatbed=dataTunisair[which(dataTunisair$Flat.bed>0),]
nrow(flatbed)
## [1] 2
nrow(flatbed)/length(dataTunisair)*100
## [1] 6.060606

Nous remarquons d’aprés la dataset que Tunisair n’a aucun avion qui comporte la classe club ni la classe premium qui sont les classes les plus modérnes et les meilleures au niveau confort.

Nous remarquons aussi qui’il n ya aucun avion avec la classe sleeper et seulement 2/28 (qui représentent seulenemnt 6%) avions disposant du flatBed(lit plat) et ce n’est pas trés important puisque Tunisair ne propose pas assez de vols à long-courriers.

#nombre d'avion qui comporte la classe economique
eco=dataTunisair[which(dataTunisair$Economy>0),]
nrow(eco)
## [1] 28
#nombre d'avion qui possede la classe bunisness
business=dataTunisair[which(dataTunisair$Business>0),]
nrow(business)
## [1] 19
nrow(business)/length(dataTunisair)*100
## [1] 57.57576

Nous remarquons que tout les avions de tunisair comportent la classe economique 28/28, et nous trouvons que 19/28 (57.57%) avions comportant la classe business qui s’adresse aux personnes effectuant des voyages professionnels ce qui est trés normal pour une compagnie qui posséde 28 avions. Ces 2 classes sont les classes les plus reservées par les voyageurs.

#moyenne des sieges de la classe economique
mean(dataTunisair$Seats..Economy.)
## [1] 138.5714
#moyenne des sieges de la classe business
mean(dataTunisair$Seats..Business.)
## [1] 12.28571
View(dataTunisair)

La moyenne du nombre de siéges des avions de classe économique est 138 supérieure à celle de la classe business qui est 12 ce qui est normal puisque la classe economique est la plus prisée des voyageurs, car elle constitue l’offre la moins chère.

eco[which.max(eco$Seats..Economy.),]
business[which.max(business$Seats..Business.),]

Nous remarquons que l’avion Airbus A330-243 posséde le plus grand nombre de siéges dans la classe économique et la classe business nous pouvons dire que c’est le plus grand avion que Tunisair posséde.

mean(dataTunisair$Seat.Width..Business.)
## [1] 14.17143
mean(dataTunisair$Seat.Pitch..Business.)
## [1] 25.07143

dans la classe business : la moyenne de la largeur des sièges est de 14.17. la moyenne de l’espace entre les sièges est de 25.07.

la moyenne de la largeur des sièges de la flotte typique est de 20.73333 la moyenne de l’espace entre les sièges est de 71.01667

mean(dataTunisair$Seat.Width..Economy.)
## [1] 17.53929
mean(dataTunisair$Seat.Pitch..Economy.)
## [1] 29.96429

dans la classe economique : la moyenne de la largeur des sièges est de 17.53. la moyenne de l’espace entre les sièges est de 29.96

-la moyenne de la largeur des sièges d’une flotte typique 17.86667 -la moyenne de l’espace entre les sièges d’une flotte typique est de 31.1

wifi=dataTunisair[which(dataTunisair$wifi>0),]
nrow(wifi)
## [1] 0
dataTunisair[which(dataTunisair$Video>0 & dataTunisair$Satellite>0 ),]

Nous remarquons que tous les avions de Tunisair ne possédent ni wifi ni video.

Nous remarquons également que l’avion Airbus A330-243 est le seul qui posséde des videos et des satellites.

-la flotte typique montre la présence de wifi de video et de satéllite

mean(dataTunisair$Range..miles)
## [1] 6240

La moyenne de la distance que les avions de tunisair peut parcourir est de 6240 .

La moyenne de la distance qu’un avion typique peut parcourir est de 6449.533 .

range=dataTunisair[which.max(dataTunisair$Range..miles.),]
range

Le même avion Airbus A330-243 peut parcourir 7767 miles.

Pour conclure Tunisair répond aux éxigences d’une flotte typique cependant elle doit améliorer quelques points comme le confort (distance entre les sièges) et des services (wifi , video )

nrow(dataTunisair[which(dataTunisair$Engines == 2),])
## [1] 28

Tous les avions de tunisair sont formés de 2 moteurs.

-la flotte typique posséde 2 moteurs .

Relation entre les variables

library("corrplot")
Tuni<-scale(dataTunisair,scale=T,center=T)
corrplot(Tuni, is.corr=FALSE)

Utilisation de l’ACP pour réduire l’information dans un nombre minimal de dimension.

library("FactoMineR")
t=PCA(dataTunisair,quanti.sup=c(18,19,21,22,23,31,33))

D’aprés ce graphique de corrélation des variables, nous pouvons voir clairement, que l’avion Airbus A330-243 v1 Airbus A330-243 v2 sont les meilleurs avions que posséde la compagnie Tunisair.

library("FactoMineR")
library("factoextra")
res.pca <- PCA(dataTunisair, graph = FALSE)

fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE 
             )

Nous pouvons donc conclure que “Airbus A330-243” est caracterisé par la meilleure range miles ,tail height et economy class et le seul avion qui posséde la video et satellite.

Une bonne representation “Cruising.Speed..mph.” qui caractérise le plus les avions Boeing. Seulement les avions “Airbus” ont la classe Business.

Tuni<-scale(dataTunisair,scale=T,center=T)
Tuni[is.nan(Tuni)] <- 0
t<-Tuni[, colSums(Tuni != 0) > 0] #pour elimner les 0 de toute les colonnes
m <- cor(t)
corrplot(m, method = "number") #voir la correlation entres les variables

dataTunisair$Cruising.Speed..mph.
##  [1] 598 514 514 514 514 559 598 598 598 598 598 598 514 514 514 514 514
## [18] 514 514 514 514 514 514 514 514 514 514 559

D’aprés la fonction corrplot nous pouvons détérminer la correlation entre les différents variables telque seats with business et seat pitch business et seats business avec la variable business ce qui est trés logique.

Preparation des données

boxplot(dataTunisair)

Nous remarquons qu’il est difficile de comparer nos variables car elles n’ont pas la même unité, donc nous devons passer par le centrage et réduction

Tuni<-scale(dataTunisair,scale=T,center=T)
Tuni[is.nan(Tuni)] <- 0
boxplot(Tuni)

Nous remarquons que la qualité du bocplot s’est ameliorée et les données sont plus lisibles et les variables sont devenues comparables.

Modelisation

head(na.omit(Tuni)) #pour voir s'il y a des données manquantes
##                              Seat.Width..Club. Seat.Pitch..Club.
## Boeing 737-600  v1                           0                 0
## Airbus A320-211 v1                           0                 0
## Airbus A320-214 v1                           0                 0
## Airbus A319-114 v1                           0                 0
## Airbus A319-114/--112 ER  v1                 0                 0
## Airbus A330-243 v1                           0                 0
##                              Seat..Club. Seat.Width..First.Class.
## Boeing 737-600  v1                     0                        0
## Airbus A320-211 v1                     0                        0
## Airbus A320-214 v1                     0                        0
## Airbus A319-114 v1                     0                        0
## Airbus A319-114/--112 ER  v1           0                        0
## Airbus A330-243 v1                     0                        0
##                              Seat.Pitch..First.Class. Seats..First.Class.
## Boeing 737-600  v1                                  0                   0
## Airbus A320-211 v1                                  0                   0
## Airbus A320-214 v1                                  0                   0
## Airbus A319-114 v1                                  0                   0
## Airbus A319-114/--112 ER  v1                        0                   0
## Airbus A330-243 v1                                  0                   0
##                              Seat.Width..Business. Seat.Pitch..Business.
## Boeing 737-600  v1                      -1.4009955            -1.3717063
## Airbus A320-211 v1                       0.5564438             0.4884994
## Airbus A320-214 v1                       0.5564438             0.4884994
## Airbus A319-114 v1                      -1.4009955            -1.3717063
## Airbus A319-114/--112 ER  v1             0.8727976             1.0356187
## Airbus A330-243 v1                       1.2583538             1.4733142
##                              Seats..Business. Seat.Width..Eco.Comfort.
## Boeing 737-600  v1                -1.18346964                        0
## Airbus A320-211 v1                -0.41283825                        0
## Airbus A320-214 v1                -0.41283825                        0
## Airbus A319-114 v1                -1.18346964                        0
## Airbus A319-114/--112 ER  v1      -0.02752255                        0
## Airbus A330-243 v1                 1.12842454                        0
##                              Seat.Pitch..Eco.Comfort. Seats..Eco.Comfort.
## Boeing 737-600  v1                                  0                   0
## Airbus A320-211 v1                                  0                   0
## Airbus A320-214 v1                                  0                   0
## Airbus A319-114 v1                                  0                   0
## Airbus A319-114/--112 ER  v1                        0                   0
## Airbus A330-243 v1                                  0                   0
##                              Seat.Width..Economy. Seat.Pitch..Economy.
## Boeing 737-600  v1                     -1.4312386          -1.21652160
## Airbus A320-211 v1                      0.5836895           0.04505636
## Airbus A320-214 v1                      0.5836895           0.04505636
## Airbus A319-114 v1                      1.4792130           0.04505636
## Airbus A319-114/--112 ER  v1           -1.2073577           1.30663431
## Airbus A330-243 v1                      0.3598086           2.56821227
##                              Seats..Economy. Accommodation
## Boeing 737-600  v1                -0.3963208    -0.7782357
## Airbus A320-211 v1                 0.3602916     0.1926326
## Airbus A320-214 v1                 0.3602916     0.1926326
## Airbus A319-114 v1                 0.1711385    -0.2928016
## Airbus A319-114/--112 ER  v1      -1.1529331    -1.4254813
## Airbus A330-243 v1                 3.2606389     2.9973634
##                              Cruising.Speed..mph. Range..miles. Engines
## Boeing 737-600  v1                      1.6144829    -1.0413121       0
## Airbus A320-211 v1                     -0.6538945    -0.1583076       0
## Airbus A320-214 v1                     -0.6538945    -0.1583076       0
## Airbus A319-114 v1                     -0.6538945     1.0729736       0
## Airbus A319-114/--112 ER  v1           -0.6538945     1.0729736       0
## Airbus A330-243 v1                      0.5613077     2.6859519       0
##                              Wingspan..ft. Tail.Height..ft. Length..ft.
## Boeing 737-600  v1              -0.1739350       -0.2723642  -0.8099488
## Airbus A320-211 v1              -0.3079766       -0.2723480   0.0759327
## Airbus A320-214 v1              -0.3079766       -0.2723480   0.0759327
## Airbus A319-114 v1              -0.3079766       -0.2723480  -0.4998902
## Airbus A319-114/--112 ER  v1    -0.3079766       -0.2723480  -0.4998902
## Airbus A330-243 v1               3.5345498        3.5405811   3.2651059
##                              Wifi     Video      Power  Satellite
## Boeing 737-600  v1              0 -0.340168 -0.2723524 -0.2723524
## Airbus A320-211 v1              0 -0.340168 -0.2723524 -0.2723524
## Airbus A320-214 v1              0 -0.340168 -0.2723524 -0.2723524
## Airbus A319-114 v1              0 -0.340168 -0.2723524 -0.2723524
## Airbus A319-114/--112 ER  v1    0  2.834734 -0.2723524 -0.2723524
## Airbus A330-243 v1              0  2.834734  3.5405811  3.5405811
##                                Flat.bed Sleeper Club First.Class
## Boeing 737-600  v1           -0.2723524       0    0           0
## Airbus A320-211 v1           -0.2723524       0    0           0
## Airbus A320-214 v1           -0.2723524       0    0           0
## Airbus A319-114 v1           -0.2723524       0    0           0
## Airbus A319-114/--112 ER  v1 -0.2723524       0    0           0
## Airbus A330-243 v1            3.5405811       0    0           0
##                                Business Eco.Comfort Economy
## Boeing 737-600  v1           -1.4267846           0       0
## Airbus A320-211 v1            0.6758453           0       0
## Airbus A320-214 v1            0.6758453           0       0
## Airbus A319-114 v1           -1.4267846           0       0
## Airbus A319-114/--112 ER  v1  0.6758453           0       0
## Airbus A330-243 v1            0.6758453           0       0
wssplot <- function(data, nc=15, seed=1234){
  wss <- (nrow(data)-1)*sum(apply(data,2,var))
  for (i in 2:nc){
    set.seed(seed)
    wss[i] <- sum(kmeans(data, centers=i)$withinss)}
  plot(1:nc, wss, type="b", xlab="Number of Clusters",
       ylab="Within groups sum of squares")}

wssplot (Tuni, nc=10, seed=1234)

D’aprés cette fonction ,le nombre optimal de cluster est 3 ou bien 4.

library(FactoMineR)
for (k in 3:4)
{
  km = kmeans(Tuni,k)
  gpe.kmeans = km$cluster
  
  datatunisaire=cbind(Tuni,gpe.kmeans)

  dataTunClus=PCA(datatunisaire, quali.sup=34,quanti.sup=c(18,19,21,22,23,31,33))
}

Nous remarquons que dans le cas où k=3 nous avons une meilleure ségmentation puisque les groupes sont plus separés.

#choisissons le k=3
set.seed(12)
km = kmeans(Tuni,3)
gpe.kmeans = km$cluster
datatunisaire=cbind(Tuni,gpe.kmeans)
dataTunClus=PCA(datatunisaire, quali.sup=34,quanti.sup=c(18,19,21,22,23,31,33))

library(FactoMineR)
which(colnames(dataTunClus$call$X)=="gpe.kmeans")
## [1] 34

table(km$cluster)
## 
##  1  2  3 
##  9 17  2

Nous avons obtenu une classe contenant 9 entrées,une 2éme avec 17 entrées et l’autre 2 entrées.

gpe.kmeans
##           Boeing 737-600  v1           Airbus A320-211 v1 
##                            1                            2 
##           Airbus A320-214 v1           Airbus A319-114 v1 
##                            2                            1 
## Airbus A319-114/--112 ER  v1           Airbus A330-243 v1 
##                            2                            3 
##           Boeing 737-600  v2            Boeing 737-600 v3 
##                            1                            1 
##            Boeing 737-600 v4            Boeing 737-600 v5 
##                            1                            1 
##            Boeing 737-600 v6            Boeing 737-600 v7 
##                            1                            1 
##           Airbus A320-211 v2           Airbus A320-211 v3 
##                            2                            2 
##          Airbus A320-211 v4            Airbus A320-211 v5 
##                            2                            2 
##           Airbus A320-211 v6           Airbus A320-211 v7 
##                            2                            2 
##           Airbus A320-211 v8           Airbus A320-211 v9 
##                            2                            2 
##           Airbus A320-214 v2           Airbus A320-214 v3 
##                            2                            2 
##           Airbus A320-214 v4           Airbus A320-214 v5 
##                            2                            2 
##           Airbus A320-214 v6           Airbus A319-114 v2 
##                            2                            1 
##  Airbus A319-114/--112 ER v2           Airbus A330-243 v2 
##                            2                            3

Determination des caractéristiques et analyse de chaque cluster

data_kmean <- cbind(dataTunisair, groupe2mean=km$cluster)
data2mean <- as.data.frame(data_kmean)
aggregate(data2mean,by=list(data2mean$groupe2mean),FUN=mean)

Nous remarquons que le cluster 3 est le meilleur, il est caracterisé par les meilleurs Seat.Pitch..Economy , Seats..Economy,cruising.speed, range.miles , le seul cluster qui comporte video, power, satellite, flat bed, accommodation et le meilleur dans la classe bunisness et economy, donc le cluster 3 represente le meilleur profil d’avion chez Tunisair de point de vue qualité.

Alors que le 1ér cluster est un cluster qui ne contient pas la classe business et le plus faible au niveau de range.miles.

le cluster 2 est le cluster caracterisé par Seat.Width..Economy et Engines Wingspan..ft, le plus faible cluster au niveau de Cruising.Speed..mph.

Nous passons a la comparaison de tunisair avec l’un de ses concurrents direct qui est le Royal Air Maroc

Chargement du jeu de données

airMaroc = read.table("marocRoyal.csv" ,sep=",",dec=",",header=T)
airMarocEconymy = read.table("marocEconomy.csv",sep=",",dec=",",header=T)
airMarocBusiness = read.table("marrocBusiness.csv",sep=",",dec=",",header=T)
tunisair2 = read.table("tunisair2.csv" ,sep=",",dec=",",header=T)
head(airMarocBusiness)
dim(airMaroc)
## [1] 16  8
dim(tunisair2)
## [1] 8 8
airMaroc[1] <- data.frame(lapply(airMaroc[1], as.character), stringsAsFactors=FALSE)
tunisair2[1] <- data.frame(lapply(tunisair2[1], as.character), stringsAsFactors=FALSE)

Nous remarquons que Tunisair posséde 8 modèles d’avion alors que royal air maroc posséde 16 modèles.

la comparaison va se baser sur la différence entre Tunisair et Royal Air Maroc au niveau du confort (seats widh, seats pitch), services offerts (wifi, video, power)

Convertir Aircraft.with.seatmap de type factor en type characters

Aircrafts <- NULL
#select all the aircraft and cleaning them
for (i in 1:nrow(airMaroc)) {
  Aircrafts <- c(Aircrafts, b<-gsub("\\(.*", "", airMaroc$Aircraft.with.seatmap))
}
#Added a colom to the ana_delta with the cleaned up name
for (i in 1:nrow(airMaroc)) {
  airMaroc[i,1] <- Aircrafts[i]
} 

Aircrafts2 <- NULL
#select all the aircraft and cleaning them
for (i in 1:nrow(tunisair2)) {
  Aircrafts2 <- c(Aircrafts2, b<-gsub("\\(.*", "", tunisair2$Aircraft.with.seatmap))
}
#Added a colom to the ana_delta with the cleaned up name
for (i in 1:nrow(tunisair2)) {
  tunisair2[i,1] <- Aircrafts2[i]
} 
avector <- as.vector(airMaroc['Aircraft.with.seatmap'])
pie(table(avector))

avector2 <- as.vector(tunisair2['Aircraft.with.seatmap'])
pie(table(avector2))

Nous remarquons que la majorité des avions de Tunisair est de type Airbus alors que chez Royal Air Maroc elle est de type Boieng.

Conversion des données

library(plyr)

airMaroc$Video.Type <- revalue(airMaroc$Video.Type, c("On-Demand TV"=1))
airMaroc$Video.Type <- revalue(airMaroc$Video.Type, c("Overhead TV"=1))
airMaroc$Video.Type <- revalue(airMaroc$Video.Type, c("None"=0))
airMaroc$Wi.Fi <- revalue(airMaroc$Wi.Fi, c("No"=0))


airMaroc$Laptop.Power <- revalue(airMaroc$Laptop.Power, c("None"=0))
airMaroc$Laptop.Power <- revalue(airMaroc$Laptop.Power, c("All Seats"=1))

airMaroc$Power.Type <- revalue(airMaroc$Power.Type, c("AC Power"=1))
airMaroc$Power.Type <- revalue(airMaroc$Power.Type, c("None"=0))


tunisair2$Video.Type <- revalue(tunisair2$Video.Type, c("Seatback TV"=1))
tunisair2$Video.Type <- revalue(tunisair2$Video.Type, c("None"=0))
tunisair2$Wi.Fi <- revalue(tunisair2$Wi.Fi, c("No"=0))


tunisair2$Laptop.Power <- revalue(tunisair2$Laptop.Power, c("None"=0))
tunisair2$Laptop.Power <- revalue(tunisair2$Laptop.Power, c("All Seats"=1))

tunisair2$Power.Type <- revalue(tunisair2$Power.Type, c("AC Power"=1))
tunisair2$Power.Type <- revalue(tunisair2$Power.Type, c("None"=0))

Comparons la moyenne de seat pitch chez Tunisair business et royal maroc business

airMarocBusiness$Seat.Pitch <- as.numeric(as.character(airMarocBusiness$Seat.Pitch))
airMarocBusiness$Seat.Pitch <- as.numeric(as.character(airMarocBusiness$Seat.Width))
#moyenne Seat.Pitch maroc
mean(airMarocBusiness$Seat.Pitch)
## [1] 20.5
#moyenne Seat.Widh maroc
mean(airMarocBusiness$Seat.Width)
## [1] 20.5
#moyenne Seat.Pitch tunisair
mean(dataTunisair$Seat.Width..Business.)
## [1] 14.17143
#moyenne Seat.Widh tunisair
mean(dataTunisair$Seat.Pitch..Business.)
## [1] 25.07143

La moyenne de “Seat.Pitch” chez Tunisair est de 14.17 inférieure a celle de Royal Air Maroc qui est 20.5.

La moyenne de “Seat.Widh” est preque la même chez les 2 compagnies dans la classe business.

Comparons maintenant la moyenne de seat widh chez Tunisair economy et Royal Air Maroc economy

airMarocEconymy$Seat.Pitch <- as.numeric(as.character(airMarocEconymy$Seat.Pitch))
airMarocEconymy$Seat.Pitch <- as.numeric(as.character(airMarocEconymy$Seat.Width))
#moyenne Seat.Pitch maroc
mean(airMarocEconymy$Seat.Pitch)
## [1] 17
#moyenne Seat.Widh maroc
mean(airMarocEconymy$Seat.Width)
## [1] 17
#moyenne Seat.Pitch tunisair
mean(dataTunisair$Seat.Width..Economy.)
## [1] 17.53929
#moyenne Seat.Widh tunisair
mean(dataTunisair$Seat.Pitch..Economy.)
## [1] 29.96429

La moyenne “Seat.pitch” est presque la même chez les 2 compagnies dans la classe économique.

La moyenne “Seat.Widh” chez Tunisair est de 29.96 supérieur à celui de Royal Air Maroc qui est 17.

airMaroc$Wi.Fi <- as.numeric(as.character(airMaroc$Wi.Fi))
nrow(airMaroc[which(airMaroc$Wi.Fi>0),])
## [1] 0

Royal Air Maroc ne dispose d’aucun avion avec le wifi. Nous remarquons donc que les 2 compagnies n’ont aucun modéle d’avion qui dispose du wifi.

airMaroc$Power.Type <- as.numeric(as.character(airMaroc$Power.Type))
nrow(airMaroc[which(airMaroc$Power.Type>0),])
## [1] 8
tunisair2$Power.Type <- as.numeric(as.character(tunisair2$Power.Type))
nrow(tunisair2[which(tunisair2$Power.Type>0),])
## [1] 2

Nous remarquons qu’il y a 8 modéles d’avions qui disposent du power type chez Royal Air Maroc alors qu’il y a 2 modéles seulement chez Tunisair.

airMaroc$Video.Type <- as.numeric(as.character(airMaroc$Video.Type))
nrow(airMaroc[which(airMaroc$Video.Type>0),])
## [1] 12
tunisair2$Video.Type <- as.numeric(as.character(tunisair2$Video.Type))
nrow(tunisair2[which(tunisair2$Video.Type>0),])
## [1] 2

La même chose pour la video type .

airMaroc$Laptop.Power <- as.numeric(as.character(airMaroc$Laptop.Power))
nrow(airMaroc[which(airMaroc$Laptop.Power>0),])
## [1] 4
tunisair2$Laptop.Power <- as.numeric(as.character(tunisair2$Laptop.Power))
nrow(tunisair2[which(tunisair2$Laptop.Power>0),])
## [1] 1

Il y a un seul modéle d’avion qui dispose du Laptop.Power chez Tunisair alors qu’on trouve 4 chez Royal Air Maroc.

Nombre d’avion

library(readxl)
ageMaroc <- read_excel("ageFlotteMaroc.xlsx")
ageTunisair <- read_excel("ageFlotteTunisair.xlsx")
sum(ageMaroc$Current)
## [1] 51
sum(ageTunisair$Current)
## [1] 28

Nous remarquons qu’il y a une grande différence de 23 avions entre le nombre d’avions de Tunisair et Royal Air Maroc

Age flotte

mean(ageMaroc$`Avg. Age`)
## [1] 12.54
mean(ageTunisair$`Avg. Age`)
## [1] 13.925

La moyenne d’âge de tunisair est de 13.925 superieure légerement à la moyenne d’âge de Royal Air Maroc qui est 12.54.

Pour conclure nous voyons que Royal air Maroc a un léger avantage par rapport à Tunisair surtout sur le plan du nombre d’avion, Video.Type et le power.

Conclusion finale

Tunisair est conforme à la la flotte typique dans :

Tunisair est non conforme à la flotte type dans :

-Si Tunisair aimerait viser haut il faut qu’elle dispose d’une first class ajouter des services comme le wifi et la video ,renforcer sa puissance et améliorer le confort (chaises et flat-bed)

Evaluation

  • Connaître l’emplacement de tunisair par rapport à ses concurrents directs (maroc) nous avons constaté que notre concurrent posséde plus de nombre d’avion (51) et il est plus avantagé en confort dans la classe business mais aussi la moyenne d’âge qui est supérieure aux avions de Royal Air Maroc .

  • Nous avons pu déterminer la position de Tunisair côté service elle est moyenne à ce niveau et elle est faible en divertissement par rapport à ses concurrents

  • Nous avons constaté que Tunisair répond aux exigences de la flotte typique avec quelques points à améliorer (comme le confort )

Déploiement

Pour récaputiler et sortir avec des solutions pouvant être envisagées par la compagnie Tunisair . Elle doit acheter de nouvelles flottes de type A330 pour les courtes distances et Boing776 pour les longues distances afin d’atteindre le marché asiatique qui s’est avéré en progression et qui a atteint une amélioration de 190% en 2018 .